/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo;

import java.util.Hashtable;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import magick.MagickException;

/**
 *
 * @author imp14T
 */
public class ListaDeImagenes implements Observer {

    private Hashtable<String,Imagen> imagenes;
    private ImagenObservable obserbable;

    public ListaDeImagenes(ImagenObservable o){
        this.obserbable=o;
        imagenes= new Hashtable<String,Imagen>();
    }
    
    public void update(Observable o, Object arg) {
        try {
            ImagenObservable ob = (ImagenObservable) o;
            Imagen im;
             Imagen x;
            if(!imagenes.isEmpty()) im= this.imagenes.get(ob.getInfo());
            else  im=null;
            switch (ob.getQuePaso()) {
                case ImagenObservable.AGREGAR_IMAGEN:
                    this.imagenes.put(ob.getImagen().getNombre(), ob.getImagen());
                    break;
                case ImagenObservable.GUARDAR_IMAGEN_MODIFICADA:
                    x=new Imagen(im.getNombre(),im.getImagen(),im.getInfo());
                    x.getImagen().setFileName(ob.getInfoAdicional());
                    x.getImagen().writeImage(x.getInfo());
                    break;
                case AplicacionesAImagen.INVERTIR_IMAGEN:
                    im.getImagen().negateImage(0);
                    this.ponerImagen(im);
                    break;
                case AplicacionesAImagen.BRILLO:
                    //im.getImagen().modulateImage("50.0,1.0,1.0");
                    im.getImagen().modulateImage(ob.getValorAdicionalD()+"");
                    this.ponerImagen(im);
                    break;
                case AplicacionesAImagen.CONTRASTE:
                    //im.getImagen().modulateImage("50.0,1.0,1.0");
                    im.getImagen().contrastImage(true);
                    this.ponerImagen(im);
                    break;
                case AplicacionesAImagen.POTENCIAR:
                    //x=new Imagen(im.getNombre(),im.getImagen().magnifyImage());
                    //this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.MAXIMIZAR:
                    x=new Imagen(im.getNombre(),im.getImagen().magnifyImage());
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.MINIMIZAR:
                    x=new Imagen(im.getNombre(),im.getImagen().minifyImage());
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.ROTAR:
                    x=new Imagen(im.getNombre(),im.getImagen().rotateImage(90));
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.AGREAGAR_FILTRO:
                     im.getImagen().setFilter(ob.getValorAdicional());
                     x=new Imagen(im.getNombre(),im.getImagen().magnifyImage().minifyImage());
                    this.ponerImagen(x);
                case AplicacionesAImagen.FILTRO_REMOLINO:
                     x=new Imagen(im.getNombre(),im.getImagen().swirlImage(ob.getValorAdicional()));
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.FILTRO_REDUCIR_RUIDO:
                     x=new Imagen(im.getNombre(),im.getImagen().reduceNoiseImage(ob.getValorAdicional()));
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.FILTRO_APLICAR_ACEITE:
                     x=new Imagen(im.getNombre(),im.getImagen().oilPaintImage(ob.getValorAdicional()));
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.FILTRO_MEDIANA:
                     x=new Imagen(im.getNombre(),im.getImagen().medianFilterImage(ob.getValorAdicional()));
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.FILTRO_IMPLODE:
                     x=new Imagen(im.getNombre(),im.getImagen().implodeImage(ob.getValorAdicional()));
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.FILTRO_BLUR:
                     x=new Imagen(im.getNombre(),im.getImagen().blurImage(100, 50));
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.FILTRO_NORMALIZAR:
                     im.getImagen().normalizeImage();
                    this.ponerImagen(im);
                    break;
                case AplicacionesAImagen.FILTRO_EQUALIZAR:
                     im.getImagen().equalizeImage();
                    this.ponerImagen(im);
                    break;
                case AplicacionesAImagen.ESPEJO_HORIZONTAL:
                     x=new Imagen(im.getNombre(),im.getImagen().flopImage());
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.ESPEJO_VERTICAL:
                     x=new Imagen(im.getNombre(),im.getImagen().flipImage());
                    this.ponerImagen(x);
                    break;
                case AplicacionesAImagen.ESCALA_DE_GRISES:
                    im.getImagen().setGrayscale();
                     //x=new Imagen(im.getNombre(),im.getImagen().quantizeImage(new QuantizeInfo()));
                    this.ponerImagen(im);
                    break;
            }
        } catch (MagickException ex) {
            Logger.getLogger(ListaDeImagenes.class.getName()).log(Level.SEVERE, null, ex);
        }


    }
    public void ponerImagen(Imagen im){
       this.imagenes.get(im.getNombre()).setImagen(im.getImagen());
       this.obserbable.setImagen(im);
       this.obserbable.setQuePaso(ImagenObservable.PONER_IMAGEN_MODIFICADA);

    }
}
